Renta
Ramon
renta_total_ramon <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Ramon.xlsx",
sheet = "Renta total", skip = 6) %>%
select(1:5) %>%
rename(anio = "...1",
trimestre = "...2",
renta_total = "(RD+RM)...3",
renta_diferencial = "...4",
renta_monopolio = "...5") %>%
mutate(anio = na.locf(anio),
unidad = "Millones de USD") %>%
select(anio, trimestre, unidad, everything(.)) %>%
filter(trimestre != "Total")
New names:
* `` -> ...1
* `` -> ...2
* `(RD+RM)` -> `(RD+RM)...3`
* `` -> ...4
* `` -> ...5
* ...
renta_total_distribucion_ramon <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Ramon.xlsx",
sheet = 2, skip = 7) %>%
rename(anio = "...1",
trimestre = "...2",
renta_total = "...3",
renta_empresas_directa = Directa,
renta_empresas_con_subsidio = "c/Promoción",
renta_apropiada_otros_total = "...6",
renta_estado_total = "...7",
renta_estado_total_con_promocion = "(sin descontar promoción)",
transferencias_del_estado = "...9",
retenciones = "...10",
regalias_nacion = "Nación",
regalias_provincias = "Provincias",
renta_sobrevaluacion = "...13",
renta_refinadoras = "...14",
renta_consumidores = "...15") %>%
mutate(anio = na.locf(anio),
unidad = "Millones de USD") %>%
select(anio, trimestre, unidad, everything(.))
New names:
* `` -> ...1
* `` -> ...2
* `` -> ...3
* `` -> ...6
* `` -> ...7
* ...
renta_total_distribucion_ramon
Barrera
renta_total_barrera <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Barrera.xlsx",
sheet = 2, skip = 1) %>%
select(-7) %>%
filter(!is.na(anio)) %>%
rename(produccion_petroleo_millones_bbl = "Extracción de petroleo" ,
costo_local_usd_bbl = "Costo local del barril" ,
precio_produccion_local_usd_bbl = "Precio de producción por barril",
precio_wti_usd_bbl = "Precio del barril WTI",
renta_total_millones_usd = "Renta petrolera" ) %>%
group_by(anio) %>%
mutate_all(as.double)
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
renta_total_barrera
Campodonico
renta_total_campodonico <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Campodonico.xlsx",
sheet = 1, skip = 1) %>%
filter(anio != "unidad") %>%
rename(produccion_millones_bbl = "Producción",
precio_produccion_local_usd_bbl = "Precio_crudo_interno",
precio_wti_usd_bbl = "WTI",
costo_local_usd_bbl = "Costo_de_Producción_arg",
renta_unitaria_usd_bbl = "Renta_Unitaria",
renta_total_millones_usd = "Renta_Petrolera") %>%
mutate_all(as.double)
renta_distribucion_campodonico <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Campodonico.xlsx",
sheet = 3, skip = 1) %>%
rename(anio ="Años" ,
unidad = "Unidad",
renta_total = "Total",
renta_empresas = "Empresas Privadas",
renta_estado_total = "Estado",
renta_consumidores = "Consumidor") %>%
mutate(unidad = "Millones de USD")
renta_estado_campodonico <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Campodonico.xlsx",
sheet = "Capturada_Estado") %>%
select(-Renta_captada_estado) %>%
rename(anio ="Años" ,
unidad = "Unidad",
regalias = "Regalías",
impuesto_ganancias = Impuesto_a_las_ganancias,
retenciones = Retenciones) %>%
mutate( unidad = "Millones de USD",
retenciones = as.double(retenciones))
NAs introducidos por coerci昼㸳n
renta_total_campodonico
renta_distribucion_campodonico
Mansilla
renta_total_mansilla <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Mansilla.xlsx",
sheet = 1, skip = 1) %>%
rename(anio = Anio,
produccion_millones_bbl = "Extraccion",
precio_produccion_local_usd_bbl = "Precio de produccion",
precio_internacional_usd_bbl = "Precio internacional",
costo_local_usd_bbl = "Costo total",
renta_unitaria_usd_bbl = "Renta petrolera",
renta_total_millones_usd = "Renta petrolera total") %>%
filter(anio != "Unidad") %>%
mutate_all(as.double)
renta_diferencial_y_monopolica_mansilla <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Mansilla.xlsx",
sheet = 2, skip = 1) %>%
rename(anio = Anio,
precio_produccion_arg = "precio de produccion argentina",
precio_poduccion_marginal = "precio de produccion area marginal",
renta_diferencial_argentina = "renta diferencial argentina",
precio_wti = "precio wti",
renta_absoluta_monopolio = "renta absoluta de monopolio",
renta_diferencial_sobre_total = "porcentaje renta diferencial sobre renta total")
renta_distribucion_mansilla <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Mansilla.xlsx",
sheet = 3, skip = 1) %>%
rename(renta_total = "Renta petrolera total",
renta_empresas = "Empresas",
renta_estado_nacional = "Estado Nacional",
renta_estado_provincial = "Estados provinciales",
renta_consumidores = "Refinadores/consumidores")
renta_total_mansilla
renta_diferencial_y_monopolica_mansilla
# renta_distribucion_mansilla
Scheimberg
renta_total_scheimberg <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Scheimberg.xlsx",
sheet = 1, skip = 3) %>%
rename(variable = "...1") %>%
gather(key = anio,
value = valor,
2:4) %>%
filter(!is.na(valor)) %>%
spread(key = variable,
value = valor) %>%
rename(venta_gas_millon_m3 = "Gas (millon m3)",
ingreso_gas_millones_usd = "Gas (millón us$)",
precio_medio_gas_usd_m3 = "Gas (us$/Mm3)",
ingresos_petroleros_totales_millones_usd = "Ingresos Petroleros",
venta_petroleo_miles_m3 = "Petróleo (mil m3)",
ingreso_petroleo_millones_usd = "Petróleo (millón us$)",
precio_medio_petroleo_usd_m3 = "Petróleo (us$/m3)",
costo_boe_usd = "Costo por BOE (en US$)" ,
costos_de_produccion_totales_millones_usd = "Petróleo + Gas (millón us$)",
precio_internacional_usd_bbl = "Precio Internacional (US$/bl)",
renta_petrolera_total_millones_usd = "Renta Petrolera") %>%
mutate_all(as.double)
New names:
* `` -> ...1
renta_distribucion_scheimberg <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Scheimberg.xlsx",
sheet = 2, skip = 3) %>%
rename(variable = "En millones de USD") %>%
gather(key = anio,
value = valor,
2:4) %>%
filter(!is.na(valor),
variable != "En %") %>%
spread(key = variable,
value = valor) %>%
rename(impuesto_ganancias = "Impuesto a las Ganancias",
ingresos_brutos_sellos = "Ingresos Brutos + Sellos",
regalias = "Regalías",
retenciones = "Retención exportación",
subsidio_consumo_gas = "Subsidio consumo gas",
subsidio_consumo_petroleo = "Subsidio consumo petróleo",
subsidio_consumo_total = "Total subsidio consumo",
corporate_take_total = "Total Corporate take",
goverment_take_total = "Total Government take" ) %>%
mutate_all(as.double) %>%
mutate(unidad = "Millones de USD") %>%
select(anio, unidad, everything(.))
tg_empresas_scheimberg <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Scheimberg.xlsx",
sheet = 3, skip = 6) %>%
rename(empresa = "...1") %>%
gather(key = anio,
value = valor,
2:ncol(.)) %>%
filter(!is.na(valor)) %>%
group_by(empresa) %>%
mutate_all(as.double) %>%
rename(resultado_operativo_sobre_activo = valor)
New names:
* `` -> ...1
`mutate_all()` ignored the following grouping variables:
Column `empresa`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
NAs introducidos por coerci昼㸳nNAs introducidos por coerci昼㸳nNAs introducidos por coerci昼㸳nNAs introducidos por coerci昼㸳n
renta_total_scheimberg
renta_distribucion_scheimberg
tg_empresas_scheimberg
renta_total <- renta_total_ramon %>%
group_by(anio) %>%
summarise(ramon = sum(renta_total)) %>%
full_join(renta_total_barrera %>%
select(anio,barrera = renta_total_millones_usd )) %>%
left_join(renta_total_campodonico %>%
select(anio, campodonico = renta_total_millones_usd)) %>%
left_join(renta_total_mansilla %>%
select(anio,mansilla = renta_total_millones_usd )) %>%
left_join(renta_total_scheimberg %>%
select(anio,scheimberg = renta_petrolera_total_millones_usd )) %>%
mutate(unidad = "Millones de USD") %>%
arrange(anio)
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
renta_total
Comparación entre autores
renta_autores <- renta_total_distribucion_ramon %>%
rename(renta_empresas = renta_empresas_con_subsidio) %>%
mutate(regalias = regalias_nacion + regalias_provincias) %>%
select(-c(regalias_nacion , regalias_provincias))%>%
gather(key = tipo_de_renta,
value = valor,
4:ncol(.)) %>%
filter(!(tipo_de_renta %in% c("renta_empresas_directa", "renta_apropiada_otros_total",
# "renta_estado_total",
"renta_estado_total_con_promocion", "transferencias_del_estado" ))) %>%
group_by(anio, unidad, tipo_de_renta) %>%
summarise(valor = sum(valor)) %>%
mutate(autor = "Ramon") %>%
full_join(renta_total_barrera %>%
select(anio, valor = renta_total_millones_usd ) %>%
mutate(autor = "Barrera",
tipo_de_renta = "renta_total"),
by = c("anio", "tipo_de_renta", "valor", "autor")) %>%
full_join(renta_distribucion_campodonico %>%
gather(key = tipo_de_renta,
value = valor,
3:ncol(.)) %>%
mutate(autor = "Campodonico")) %>%
full_join(renta_estado_campodonico %>%
gather(key = tipo_de_renta,
value = valor,
3:ncol(.)) %>%
mutate(autor = "Campodonico")) %>%
full_join(renta_distribucion_mansilla %>%
mutate(renta_estado_total = renta_estado_provincial + renta_estado_nacional ) %>%
select(-c(renta_estado_provincial, renta_estado_nacional)) %>%
gather(key = tipo_de_renta,
value = valor,
3:ncol(.)) %>%
mutate(autor = "Mansilla")) %>%
full_join(renta_distribucion_scheimberg %>%
left_join(renta_total_scheimberg %>%
select(anio, renta_total = renta_petrolera_total_millones_usd)) %>%
rename(renta_estado_total = goverment_take_total,
renta_empresas = corporate_take_total) %>%
gather(key = tipo_de_renta,
value = valor,
3:ncol(.)) %>%
mutate(autor = "Scheimberg") %>%
filter(!(tipo_de_renta %in% c("subsidio_consumo_gas", "subsidio_consumo_petroleo")))) %>%
ungroup() %>%
mutate(unidad = "Millones de USD")
`summarise()` has grouped output by 'anio', 'unidad'. You can override using the `.groups` argument.
Joining, by = c("anio", "unidad", "tipo_de_renta", "valor", "autor")
Joining, by = c("anio", "unidad", "tipo_de_renta", "valor", "autor")
Joining, by = c("anio", "unidad", "tipo_de_renta", "valor", "autor")
Joining, by = "anio"
Joining, by = c("anio", "unidad", "tipo_de_renta", "valor", "autor")
# anio = as.Date(paste0(anio, "-12-31"), format = "%Y-%m-%d"))
renta_autores
# write.csv(renta_autores, "renta_autores.csv")
graf_renta_total_autores <- renta_autores %>%
filter(tipo_de_renta%in% c("renta_total", "renta_estado_total")) %>%
ggplot(aes(anio, valor, color = autor))+
geom_line()+
geom_point()+
facet_wrap(~tipo_de_renta)+
labs(title = "Renta hidrocarburífera",
subtitle = "Comparación de estimaciones. Millones USD",
y = "Millones de USD")+
theme_classic()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
graf_tipos_renta <- renta_autores %>%
filter(!(tipo_de_renta%in% c("renta_total", "renta_estado_total"))) %>%
ggplot(aes(anio, valor, color = autor))+
geom_line()+
geom_point()+
facet_wrap(~tipo_de_renta)+
labs(title = "Renta hidrocarburífera",
subtitle = "Comparación de estimaciones. Millones USD",
y = "Millones de USD")+
theme_classic()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
plotly::ggplotly(graf_renta_total_autores)
plotly::ggplotly(graf_tipos_renta)
Costos
YPF_costos <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/YPF costos.xlsx") %>%
select(anio = "Año", lifting_cost = "Costo \"lifting\" al cambio BNA" ,
exp_cost = "Costos de Exploración/boe" ,des_cost= "Costos de Desarrollo/boe",
trans_cost = "Costos de Transporte y otros/boe" ) %>%
mutate(all_cost= lifting_cost +exp_cost +trans_cost + des_cost,
unidad= "USD/BOE", autor = "Propia (YPF)",
anio = as.double(anio))
New names:
* Unidad -> Unidad...3
* Unidad -> Unidad...5
* Unidad -> Unidad...10
* Unidad -> Unidad...15
* Unidad -> Unidad...18
* ...
NAs introducidos por coerci昼㸳n
costos_ypf <- read_csv("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/YPF costos.xlsx - Hoja1.csv",
col_types = cols(`Año` = col_double()), locale = locale(decimal_mark = ",")) %>%
rename(anio = "Año",
costo_produccion_avg = "Costos de Producción Promedio", costo_lifting = 'Costo \"lifting\"',
impuestos = "Costo por Impuestos locales y similares", otros_costos = "Otros Costos") %>%
select(anio, costo_produccion_avg, costo_lifting, impuestos, otros_costos) %>%
filter(!is.na(anio)) %>%
# mutate(costo = str_replace(costo, ",", ".")) %>%
# mutate_all(function(x) str_replace(x, ",", ".")) %>%
mutate_all(as.double) %>%
left_join(tcp_3500 %>% select(anio, tcc =tcc_avg)) %>%
gather(key = variable, value = valor, 2:5 ) %>%
mutate( valor = valor/tcc, unidad= "USD/BOE", autor = "Propia (YPF)")
Duplicated column names deduplicated: 'Unidad' => 'Unidad_1' [8], 'Unidad' => 'Unidad_2' [11], 'Unidad' => 'Unidad_3' [15], 'Unidad' => 'Unidad_4' [19]1 parsing failure.
row col expected actual file
25 A昼㸱o a double Fuente: YPF, S.A. Financial Statements 2008 to 2020 'C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/YPF costos.xlsx - Hoja1.csv'
Joining, by = "anio"
# mice::md.pattern(costos_ypf, rotate.names = T)
#bolivia EMI
costo_bolivia <- read_excel( "/Archivos/repos/hidrocarburos/analisis/data/bolivia/TG YPFB.xlsx",
sheet = "Costos II sin ponderación", skip = 4) %>%
rename(anio = "...1", costo_boe = "u$s/BPE", costo_mmbtu = "u$d/MMBTU") %>%
select(anio, costo_boe, costo_mmbtu) %>%
filter(!is.na(costo_boe)) %>%
mutate(autor = "Mussi (Bolivia)",
anio = as.double(anio))
New names:
* `` -> ...1
* Total -> Total...4
* `` -> ...5
* Total -> Total...8
* `` -> ...9
* ...
# Costos en BOE o bbl
costos <- renta_total_scheimberg %>%
select(anio, costo = costo_boe_usd) %>%
mutate(autor = "Scheimberg") %>%
rbind(renta_total_mansilla %>%
select(anio, costo = costo_local_usd_bbl) %>%
mutate( autor = "Mansilla")) %>%
rbind(renta_total_campodonico %>%
select(anio, costo = costo_local_usd_bbl) %>%
mutate( autor = "Campodonico")) %>%
rbind(renta_total_barrera %>%
select(anio, costo = costo_local_usd_bbl) %>%
mutate( autor = "Barrera")) %>%
rbind(costos_ccnn %>% select(costo= costo_boe, everything(.), -c(fuente, costo_mmbtu))) %>%
# rbind(costos_ypf %>% filter(variable == "costo_produccion_avg") %>% select(anio, costo= valor, autor)) %>%
rbind(YPF_costos %>% select(anio, costo= all_cost, autor)) %>%
# rbind(costo_bolivia %>% select(-costo_mmbtu)) %>%
mutate(unidad = "USD/BOE")
#Costos en BOE
ggplot(costos, aes(anio, costo, color = autor))+
geom_line()+
geom_point()+
labs(title= "Costos de producción hidrocarburífero en Argentina", subtitle = "Comparacion propia (CCNN e YPF) versus otros autores (balances)",
caption = "Nota: Sólo Scheimberg y estimación propia presentan costos en BOE",
y = "USD/barril", x ="Año")+
scale_color_discrete(name= "Autor")+
theme(legend.position = "bottom")#+

# scale_y_continuous(breaks=seq(0,16,2))
#Costos en MMBTU
costos_ccnn %>%
select(-c(fuente, costo_boe)) %>%
mutate(autor = "Argentina (Propia)") %>%
rbind(costo_bolivia %>% select(-costo_boe)) %>%
ggplot( aes(anio, costo_mmbtu, color = autor))+
geom_line()+
geom_point()+
labs(title= "Costos de producción hidrocarburífero en Argentina y Bolivia",
subtitle = "Comparacion propia (CCNN) versus EM (YPFB)",
y = "USD/MMBTU", x ="Año")+
scale_color_discrete(name= "País")+
theme(legend.position = "bottom")#+

writexl::write_xlsx(costos, path = "/Archivos/repos/hidrocarburos/analisis/resultados/argentina/costos.xlsx")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCkN1YWRybyBjb21wYXJhdGl2bw0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh6b28pDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHJlYWR4bCkNCg0KY29tcGFyYWNpb25fZXN0aW1hY2lvbmVzX3JlbnRhX2hpZHJvY2FyYnVyaWZlcmEgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvY29tcGFyYWNpb25fZXN0aW1hY2lvbmVzX3JlbnRhX2hpZHJvY2FyYnVyaWZlcmEueGxzeCIpICU+JSANCiAgc2VsZWN0KC1mdWVudGUpICU+JSANCiAgc3ByZWFkKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICB2YWx1ZSA9IGNyaXRlcmlvX2NhbGN1bG8pICANCg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3goY29tcGFyYWNpb25fZXN0aW1hY2lvbmVzX3JlbnRhX2hpZHJvY2FyYnVyaWZlcmEsDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJjdWFkcm9fY29sdW1uYXMueGxzeCIpDQpgYGANCg0KIyBSZW50YQ0KDQojIyBSYW1vbg0KYGBge3J9DQpyZW50YV90b3RhbF9yYW1vbiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9BdXRvcmVzL1JhbW9uLnhsc3giLCANCiAgICBzaGVldCA9ICJSZW50YSB0b3RhbCIsIHNraXAgPSA2KSAlPiUgDQogIHNlbGVjdCgxOjUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiLi4uMSIsDQogICAgICAgICB0cmltZXN0cmUgPSAiLi4uMiIsDQogICAgICAgICAgcmVudGFfdG90YWwgPSAiKFJEK1JNKS4uLjMiLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWwgPSAiLi4uNCIsIA0KICAgICAgICAgcmVudGFfbW9ub3BvbGlvID0gIi4uLjUiKSAlPiUgDQogIG11dGF0ZShhbmlvID0gIG5hLmxvY2YoYW5pbyksDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIikgJT4lDQogIHNlbGVjdChhbmlvLCB0cmltZXN0cmUsIHVuaWRhZCwgZXZlcnl0aGluZyguKSkgJT4lIA0KICBmaWx0ZXIodHJpbWVzdHJlICE9ICJUb3RhbCIpIA0KICAgICAgICAgDQoNCnJlbnRhX3RvdGFsX2Rpc3RyaWJ1Y2lvbl9yYW1vbiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9BdXRvcmVzL1JhbW9uLnhsc3giLCANCiAgICBzaGVldCA9IDIsIHNraXAgPSA3KSAlPiUgDQogICByZW5hbWUoYW5pbyA9ICIuLi4xIiwNCiAgICAgICAgIHRyaW1lc3RyZSA9ICIuLi4yIiwNCiAgICAgICAgICByZW50YV90b3RhbCA9ICIuLi4zIiwNCiAgICAgICAgIHJlbnRhX2VtcHJlc2FzX2RpcmVjdGEgPSBEaXJlY3RhLA0KICAgICAgICAgcmVudGFfZW1wcmVzYXNfY29uX3N1YnNpZGlvID0gImMvUHJvbW9jacOzbiIsDQogICAgICAgICByZW50YV9hcHJvcGlhZGFfb3Ryb3NfdG90YWwgPSAiLi4uNiIsIA0KICAgICAgICAgcmVudGFfZXN0YWRvX3RvdGFsID0gIi4uLjciLA0KICAgICAgICAgcmVudGFfZXN0YWRvX3RvdGFsX2Nvbl9wcm9tb2Npb24gPSAiKHNpbiBkZXNjb250YXIgcHJvbW9jacOzbikiLA0KICAgICAgICAgdHJhbnNmZXJlbmNpYXNfZGVsX2VzdGFkbyA9ICIuLi45IiwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gIi4uLjEwIiwNCiAgICAgICAgIHJlZ2FsaWFzX25hY2lvbiA9ICJOYWNpw7NuIiwNCiAgICAgICAgIHJlZ2FsaWFzX3Byb3ZpbmNpYXMgPSAiUHJvdmluY2lhcyIsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbiA9ICIuLi4xMyIsDQogICAgICAgICByZW50YV9yZWZpbmFkb3JhcyA9ICIuLi4xNCIsDQogICAgICAgICByZW50YV9jb25zdW1pZG9yZXMgPSAiLi4uMTUiKSAlPiUgDQogICAgbXV0YXRlKGFuaW8gPSAgbmEubG9jZihhbmlvKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB0cmltZXN0cmUsIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQpyZW50YV90b3RhbF9kaXN0cmlidWNpb25fcmFtb24NCmBgYA0KDQoNCg0KIyMgQmFycmVyYQ0KYGBge3J9DQpyZW50YV90b3RhbF9iYXJyZXJhIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBjYWxjdWxvIHJlbnRhIG90cm9zL0F1dG9yZXMvQmFycmVyYS54bHN4IiwgDQogICAgc2hlZXQgPSAyLCBza2lwID0gMSkgJT4lIA0KICBzZWxlY3QoLTcpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICByZW5hbWUocHJvZHVjY2lvbl9wZXRyb2xlb19taWxsb25lc19iYmwgPSAiRXh0cmFjY2nDs24gZGUgcGV0cm9sZW8iICwNCiAgICAgICAgIGNvc3RvX2xvY2FsX3VzZF9iYmwgPSAiQ29zdG8gbG9jYWwgZGVsIGJhcnJpbCIgLA0KICAgICAgICAgcHJlY2lvX3Byb2R1Y2Npb25fbG9jYWxfdXNkX2JibCA9ICAiUHJlY2lvIGRlIHByb2R1Y2Npw7NuIHBvciBiYXJyaWwiLCANCiAgICAgICAgIHByZWNpb193dGlfdXNkX2JibCA9ICAiUHJlY2lvIGRlbCBiYXJyaWwgV1RJIiwgDQogICAgICAgICByZW50YV90b3RhbF9taWxsb25lc191c2QgPSAiUmVudGEgcGV0cm9sZXJhIiApICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCnJlbnRhX3RvdGFsX2JhcnJlcmENCmBgYA0KDQojIyBDYW1wb2Rvbmljbw0KYGBge3J9DQpyZW50YV90b3RhbF9jYW1wb2RvbmljbyAgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9DYW1wb2Rvbmljby54bHN4IiwgDQogICAgc2hlZXQgPSAxLCBza2lwID0gMSkgJT4lIA0KICBmaWx0ZXIoYW5pbyAhPSAidW5pZGFkIikgJT4lDQogIHJlbmFtZShwcm9kdWNjaW9uX21pbGxvbmVzX2JibCA9ICJQcm9kdWNjacOzbiIsDQogICAgICAgICBwcmVjaW9fcHJvZHVjY2lvbl9sb2NhbF91c2RfYmJsID0gIlByZWNpb19jcnVkb19pbnRlcm5vIiwNCiAgICAgICAgIHByZWNpb193dGlfdXNkX2JibCAgPSAiV1RJIiwgDQogICAgICAgICBjb3N0b19sb2NhbF91c2RfYmJsID0gIkNvc3RvX2RlX1Byb2R1Y2Npw7NuX2FyZyIsDQogICAgICAgICByZW50YV91bml0YXJpYV91c2RfYmJsID0gIlJlbnRhX1VuaXRhcmlhIiwNCiAgICAgICAgIHJlbnRhX3RvdGFsX21pbGxvbmVzX3VzZCA9ICJSZW50YV9QZXRyb2xlcmEiKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpyZW50YV9kaXN0cmlidWNpb25fY2FtcG9kb25pY28gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9DYW1wb2Rvbmljby54bHN4IiwgDQogICAgc2hlZXQgPSAzLCBza2lwID0gMSkgJT4lIA0KICByZW5hbWUoYW5pbyA9IkHDsW9zIiAgICwNCiAgICAgICAgIHVuaWRhZCA9ICJVbmlkYWQiLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAiVG90YWwiLA0KICAgICAgICAgcmVudGFfZW1wcmVzYXMgPSAiRW1wcmVzYXMgUHJpdmFkYXMiLA0KICAgICAgICAgcmVudGFfZXN0YWRvX3RvdGFsID0gICJFc3RhZG8iLA0KICAgICAgICAgcmVudGFfY29uc3VtaWRvcmVzID0gIkNvbnN1bWlkb3IiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIikNCg0KcmVudGFfZXN0YWRvX2NhbXBvZG9uaWNvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBjYWxjdWxvIHJlbnRhIG90cm9zL0F1dG9yZXMvQ2FtcG9kb25pY28ueGxzeCIsIA0KICAgIHNoZWV0ID0gIkNhcHR1cmFkYV9Fc3RhZG8iKSAlPiUgDQogIHNlbGVjdCgtUmVudGFfY2FwdGFkYV9lc3RhZG8pICU+JSANCiAgcmVuYW1lKGFuaW8gPSJBw7FvcyIgICAsDQogICAgICAgICB1bmlkYWQgPSAiVW5pZGFkIiwNCiAgICAgICAgIHJlZ2FsaWFzID0gIlJlZ2Fsw61hcyIsDQogICAgICAgICBpbXB1ZXN0b19nYW5hbmNpYXMgPSBJbXB1ZXN0b19hX2xhc19nYW5hbmNpYXMsDQogICAgICAgICByZXRlbmNpb25lcyA9IFJldGVuY2lvbmVzKSAlPiUgDQogIG11dGF0ZSggdW5pZGFkID0gIk1pbGxvbmVzIGRlIFVTRCIsDQogICAgICAgICAgcmV0ZW5jaW9uZXMgPSBhcy5kb3VibGUocmV0ZW5jaW9uZXMpKQ0KICAgICAgICAgDQogICAgICAgICANCnJlbnRhX3RvdGFsX2NhbXBvZG9uaWNvDQpyZW50YV9kaXN0cmlidWNpb25fY2FtcG9kb25pY28NCmBgYA0KDQojIyBNYW5zaWxsYQ0KYGBge3J9DQpyZW50YV90b3RhbF9tYW5zaWxsYSAgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9NYW5zaWxsYS54bHN4IiwgDQogICAgc2hlZXQgPSAxLCBza2lwID0gMSkgJT4lIA0KICByZW5hbWUoYW5pbyA9IEFuaW8sDQogICAgICAgICBwcm9kdWNjaW9uX21pbGxvbmVzX2JibCA9ICJFeHRyYWNjaW9uIiwNCiAgICAgICAgIHByZWNpb19wcm9kdWNjaW9uX2xvY2FsX3VzZF9iYmwgPSAiUHJlY2lvIGRlIHByb2R1Y2Npb24iLA0KICAgICAgICAgcHJlY2lvX2ludGVybmFjaW9uYWxfdXNkX2JibCAgPSAiUHJlY2lvIGludGVybmFjaW9uYWwiLCANCiAgICAgICAgIGNvc3RvX2xvY2FsX3VzZF9iYmwgPSAiQ29zdG8gdG90YWwiLA0KICAgICAgICAgcmVudGFfdW5pdGFyaWFfdXNkX2JibCA9ICJSZW50YSBwZXRyb2xlcmEiLA0KICAgICAgICAgcmVudGFfdG90YWxfbWlsbG9uZXNfdXNkID0gIlJlbnRhIHBldHJvbGVyYSB0b3RhbCIpICU+JSANCiAgICBmaWx0ZXIoYW5pbyAhPSAiVW5pZGFkIikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcmVudGFfZGlmZXJlbmNpYWxfeV9tb25vcG9saWNhX21hbnNpbGxhIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBjYWxjdWxvIHJlbnRhIG90cm9zL0F1dG9yZXMvTWFuc2lsbGEueGxzeCIsIA0KICAgIHNoZWV0ID0gMiwgc2tpcCA9IDEpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBBbmlvLA0KICAgICAgICAgcHJlY2lvX3Byb2R1Y2Npb25fYXJnID0gInByZWNpbyBkZSBwcm9kdWNjaW9uIGFyZ2VudGluYSIsDQogICAgICAgICBwcmVjaW9fcG9kdWNjaW9uX21hcmdpbmFsID0gInByZWNpbyBkZSBwcm9kdWNjaW9uIGFyZWEgbWFyZ2luYWwiLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfYXJnZW50aW5hID0gInJlbnRhIGRpZmVyZW5jaWFsIGFyZ2VudGluYSIsDQogICAgICAgICBwcmVjaW9fd3RpID0gInByZWNpbyB3dGkiLA0KICAgICAgICAgcmVudGFfYWJzb2x1dGFfbW9ub3BvbGlvID0gInJlbnRhIGFic29sdXRhIGRlIG1vbm9wb2xpbyIsDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9zb2JyZV90b3RhbCA9ICJwb3JjZW50YWplIHJlbnRhIGRpZmVyZW5jaWFsIHNvYnJlIHJlbnRhIHRvdGFsIikNCg0KcmVudGFfZGlzdHJpYnVjaW9uX21hbnNpbGxhIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBjYWxjdWxvIHJlbnRhIG90cm9zL0F1dG9yZXMvTWFuc2lsbGEueGxzeCIsIA0KICAgIHNoZWV0ID0gMywgc2tpcCA9IDEpICU+JSANCiAgcmVuYW1lKHJlbnRhX3RvdGFsID0gIlJlbnRhIHBldHJvbGVyYSB0b3RhbCIsDQogICAgICAgICByZW50YV9lbXByZXNhcyA9ICJFbXByZXNhcyIsDQogICAgICAgICByZW50YV9lc3RhZG9fbmFjaW9uYWwgPSAgIkVzdGFkbyBOYWNpb25hbCIsDQogICAgICAgICByZW50YV9lc3RhZG9fcHJvdmluY2lhbCA9ICAiRXN0YWRvcyBwcm92aW5jaWFsZXMiLA0KICAgICAgICAgcmVudGFfY29uc3VtaWRvcmVzID0gIlJlZmluYWRvcmVzL2NvbnN1bWlkb3JlcyIpDQoNCnJlbnRhX3RvdGFsX21hbnNpbGxhIA0KcmVudGFfZGlmZXJlbmNpYWxfeV9tb25vcG9saWNhX21hbnNpbGxhDQojIHJlbnRhX2Rpc3RyaWJ1Y2lvbl9tYW5zaWxsYQ0KYGBgDQoNCiMjIFNjaGVpbWJlcmcNCmBgYHtyfQ0KcmVudGFfdG90YWxfc2NoZWltYmVyZyAgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9TY2hlaW1iZXJnLnhsc3giLCANCiAgICBzaGVldCA9IDEsIHNraXAgPSAzKSAlPiUgDQogIHJlbmFtZSh2YXJpYWJsZSA9ICIuLi4xIikgJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOjQpICU+JSANCiAgICBmaWx0ZXIoIWlzLm5hKHZhbG9yKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIHJlbmFtZSh2ZW50YV9nYXNfbWlsbG9uX20zID0gIkdhcyAobWlsbG9uIG0zKSIsDQogICAgICAgICBpbmdyZXNvX2dhc19taWxsb25lc191c2QgPSAiR2FzIChtaWxsw7NuIHVzJCkiLA0KICAgICAgICAgcHJlY2lvX21lZGlvX2dhc191c2RfbTMgPSAiR2FzICh1cyQvTW0zKSIsDQogICAgICAgICBpbmdyZXNvc19wZXRyb2xlcm9zX3RvdGFsZXNfbWlsbG9uZXNfdXNkID0gIkluZ3Jlc29zIFBldHJvbGVyb3MiLA0KICAgICAgICAgdmVudGFfcGV0cm9sZW9fbWlsZXNfbTMgPSAiUGV0csOzbGVvIChtaWwgbTMpIiwNCiAgICAgICAgIGluZ3Jlc29fcGV0cm9sZW9fbWlsbG9uZXNfdXNkID0gIlBldHLDs2xlbyAobWlsbMOzbiB1cyQpIiwNCiAgICAgICAgIHByZWNpb19tZWRpb19wZXRyb2xlb191c2RfbTMgPSAiUGV0csOzbGVvICh1cyQvbTMpIiwNCiAgICAgICAgIGNvc3RvX2JvZV91c2QgPSAiQ29zdG8gcG9yIEJPRSAoZW4gVVMkKSIgLA0KICAgICAgICAgY29zdG9zX2RlX3Byb2R1Y2Npb25fdG90YWxlc19taWxsb25lc191c2QgPSAiUGV0csOzbGVvICsgR2FzIChtaWxsw7NuIHVzJCkiLA0KICAgICAgICAgcHJlY2lvX2ludGVybmFjaW9uYWxfdXNkX2JibCA9ICJQcmVjaW8gSW50ZXJuYWNpb25hbCAoVVMkL2JsKSIsDQogICAgICAgICByZW50YV9wZXRyb2xlcmFfdG90YWxfbWlsbG9uZXNfdXNkID0gIlJlbnRhIFBldHJvbGVyYSIpICU+JSANCiAgIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpyZW50YV9kaXN0cmlidWNpb25fc2NoZWltYmVyZyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9BdXRvcmVzL1NjaGVpbWJlcmcueGxzeCIsIA0KICAgIHNoZWV0ID0gMiwgc2tpcCA9IDMpICU+JSANCiAgIHJlbmFtZSh2YXJpYWJsZSA9ICJFbiBtaWxsb25lcyBkZSBVU0QiKSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6NCkgJT4lIA0KICAgIGZpbHRlcighaXMubmEodmFsb3IpLA0KICAgICAgICAgICB2YXJpYWJsZSAhPSAiRW4gJSIpICU+JSANCiAgIHNwcmVhZChrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpICU+JSANCiAgcmVuYW1lKGltcHVlc3RvX2dhbmFuY2lhcyA9ICJJbXB1ZXN0byBhIGxhcyBHYW5hbmNpYXMiLA0KICAgICAgICAgaW5ncmVzb3NfYnJ1dG9zX3NlbGxvcyA9ICJJbmdyZXNvcyBCcnV0b3MgKyBTZWxsb3MiLA0KICAgICAgICAgcmVnYWxpYXMgPSAiUmVnYWzDrWFzIiwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gIlJldGVuY2nDs24gZXhwb3J0YWNpw7NuIiwNCiAgICAgICAgIHN1YnNpZGlvX2NvbnN1bW9fZ2FzID0gIlN1YnNpZGlvIGNvbnN1bW8gZ2FzIiwNCiAgICAgICAgIHN1YnNpZGlvX2NvbnN1bW9fcGV0cm9sZW8gPSAiU3Vic2lkaW8gY29uc3VtbyBwZXRyw7NsZW8iLA0KICAgICAgICAgc3Vic2lkaW9fY29uc3Vtb190b3RhbCA9ICJUb3RhbCBzdWJzaWRpbyBjb25zdW1vIiwNCiAgICAgICAgIGNvcnBvcmF0ZV90YWtlX3RvdGFsID0gIlRvdGFsIENvcnBvcmF0ZSB0YWtlIiwNCiAgICAgICAgIGdvdmVybWVudF90YWtlX3RvdGFsID0gIlRvdGFsIEdvdmVybm1lbnQgdGFrZSIgKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KICANCiAgDQoNCnRnX2VtcHJlc2FzX3NjaGVpbWJlcmcgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9TY2hlaW1iZXJnLnhsc3giLCANCiAgICBzaGVldCA9IDMsIHNraXAgPSA2KSAlPiUgDQogIHJlbmFtZShlbXByZXNhID0gIi4uLjEiKSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHZhbG9yKSkgJT4lIA0KICBncm91cF9ieShlbXByZXNhKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIHJlbmFtZShyZXN1bHRhZG9fb3BlcmF0aXZvX3NvYnJlX2FjdGl2byA9IHZhbG9yKQ0KDQpyZW50YV90b3RhbF9zY2hlaW1iZXJnDQpyZW50YV9kaXN0cmlidWNpb25fc2NoZWltYmVyZw0KdGdfZW1wcmVzYXNfc2NoZWltYmVyZw0KYGBgDQoNCmBgYHtyfQ0KcmVudGFfdG90YWwgPC0gcmVudGFfdG90YWxfcmFtb24gJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShyYW1vbiA9IHN1bShyZW50YV90b3RhbCkpICU+JSANCiAgZnVsbF9qb2luKHJlbnRhX3RvdGFsX2JhcnJlcmEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbyxiYXJyZXJhID0gcmVudGFfdG90YWxfbWlsbG9uZXNfdXNkICkpICU+JQ0KICBsZWZ0X2pvaW4ocmVudGFfdG90YWxfY2FtcG9kb25pY28gJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjYW1wb2RvbmljbyA9IHJlbnRhX3RvdGFsX21pbGxvbmVzX3VzZCkpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX3RvdGFsX21hbnNpbGxhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sbWFuc2lsbGEgPSByZW50YV90b3RhbF9taWxsb25lc191c2QgKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfdG90YWxfc2NoZWltYmVyZyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLHNjaGVpbWJlcmcgPSByZW50YV9wZXRyb2xlcmFfdG90YWxfbWlsbG9uZXNfdXNkICkpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCg0KcmVudGFfdG90YWwNCmBgYA0KDQoNCiMjIENvbXBhcmFjacOzbiBlbnRyZSBhdXRvcmVzDQpgYGB7cn0NCnJlbnRhX2F1dG9yZXMgPC0gcmVudGFfdG90YWxfZGlzdHJpYnVjaW9uX3JhbW9uICU+JSANCiAgcmVuYW1lKHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXNfY29uX3N1YnNpZGlvKSAlPiUgDQogIG11dGF0ZShyZWdhbGlhcyA9IHJlZ2FsaWFzX25hY2lvbiArIHJlZ2FsaWFzX3Byb3ZpbmNpYXMpICU+JSANCiAgc2VsZWN0KC1jKHJlZ2FsaWFzX25hY2lvbiAsIHJlZ2FsaWFzX3Byb3ZpbmNpYXMpKSU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIGZpbHRlcighKHRpcG9fZGVfcmVudGEgJWluJSBjKCJyZW50YV9lbXByZXNhc19kaXJlY3RhIiwgInJlbnRhX2Fwcm9waWFkYV9vdHJvc190b3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicmVudGFfZXN0YWRvX3RvdGFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVudGFfZXN0YWRvX3RvdGFsX2Nvbl9wcm9tb2Npb24iLCAgInRyYW5zZmVyZW5jaWFzX2RlbF9lc3RhZG8iICkpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCwgdGlwb19kZV9yZW50YSkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IpKSAlPiUgDQogIG11dGF0ZShhdXRvciA9ICJSYW1vbiIpICU+JSANCiAgZnVsbF9qb2luKHJlbnRhX3RvdGFsX2JhcnJlcmEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdmFsb3IgPSByZW50YV90b3RhbF9taWxsb25lc191c2QgKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShhdXRvciA9ICJCYXJyZXJhIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpcG9fZGVfcmVudGEgPSAicmVudGFfdG90YWwiKSwNCiAgICAgICAgICAgIGJ5ID0gYygiYW5pbyIsICJ0aXBvX2RlX3JlbnRhIiwgInZhbG9yIiwgImF1dG9yIikpICU+JQ0KICBmdWxsX2pvaW4ocmVudGFfZGlzdHJpYnVjaW9uX2NhbXBvZG9uaWNvICU+JSANCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgICAgICAgICAgICAgMzpuY29sKC4pKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShhdXRvciA9ICJDYW1wb2RvbmljbyIpKSAlPiUgDQogIGZ1bGxfam9pbihyZW50YV9lc3RhZG9fY2FtcG9kb25pY28gJT4lIA0KICAgICAgICAgICAgICBnYXRoZXIoa2V5ID0gdGlwb19kZV9yZW50YSwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiAgICAgICAgICAgICAgICAgICAgIDM6bmNvbCguKSkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoYXV0b3IgPSAiQ2FtcG9kb25pY28iKSkgJT4lDQogIGZ1bGxfam9pbihyZW50YV9kaXN0cmlidWNpb25fbWFuc2lsbGEgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUocmVudGFfZXN0YWRvX3RvdGFsID0gcmVudGFfZXN0YWRvX3Byb3ZpbmNpYWwgKyByZW50YV9lc3RhZG9fbmFjaW9uYWwgKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KC1jKHJlbnRhX2VzdGFkb19wcm92aW5jaWFsLCByZW50YV9lc3RhZG9fbmFjaW9uYWwpKSAlPiUNCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgICAgICAgICAgICAgMzpuY29sKC4pKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShhdXRvciA9ICJNYW5zaWxsYSIpKSAgJT4lIA0KICBmdWxsX2pvaW4ocmVudGFfZGlzdHJpYnVjaW9uX3NjaGVpbWJlcmcgJT4lIA0KICAgICAgICAgICAgICBsZWZ0X2pvaW4ocmVudGFfdG90YWxfc2NoZWltYmVyZyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByZW50YV90b3RhbCA9IHJlbnRhX3BldHJvbGVyYV90b3RhbF9taWxsb25lc191c2QpKSAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShyZW50YV9lc3RhZG9fdG90YWwgPSBnb3Zlcm1lbnRfdGFrZV90b3RhbCwNCiAgICAgICAgICAgICAgICAgICAgIHJlbnRhX2VtcHJlc2FzID0gY29ycG9yYXRlX3Rha2VfdG90YWwpICU+JSANCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgICAgICAgICAgICAgMzpuY29sKC4pKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShhdXRvciA9ICJTY2hlaW1iZXJnIikgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoISh0aXBvX2RlX3JlbnRhICVpbiUgYygic3Vic2lkaW9fY29uc3Vtb19nYXMiLCAic3Vic2lkaW9fY29uc3Vtb19wZXRyb2xlbyIpKSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKQ0KICAjIGFuaW8gPSBhcy5EYXRlKHBhc3RlMChhbmlvLCAiLTEyLTMxIiksIGZvcm1hdCA9ICIlWS0lbS0lZCIpKQ0KcmVudGFfYXV0b3Jlcw0KDQojIHdyaXRlLmNzdihyZW50YV9hdXRvcmVzLCAicmVudGFfYXV0b3Jlcy5jc3YiKQ0KYGBgDQoNCg0KYGBge3J9DQoNCmdyYWZfcmVudGFfdG90YWxfYXV0b3JlcyA8LSByZW50YV9hdXRvcmVzICU+JSANCiAgZmlsdGVyKHRpcG9fZGVfcmVudGElaW4lIGMoInJlbnRhX3RvdGFsIiwgInJlbnRhX2VzdGFkb190b3RhbCIpKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gYXV0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgZmFjZXRfd3JhcCh+dGlwb19kZV9yZW50YSkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgZXN0aW1hY2lvbmVzLiBNaWxsb25lcyBVU0QiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQoNCmdyYWZfdGlwb3NfcmVudGEgPC0gcmVudGFfYXV0b3JlcyAlPiUgDQogIGZpbHRlcighKHRpcG9fZGVfcmVudGElaW4lIGMoInJlbnRhX3RvdGFsIiwgInJlbnRhX2VzdGFkb190b3RhbCIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGF1dG9yKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGZhY2V0X3dyYXAofnRpcG9fZGVfcmVudGEpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGVzdGltYWNpb25lcy4gTWlsbG9uZXMgVVNEIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQpwbG90bHk6OmdncGxvdGx5KGdyYWZfcmVudGFfdG90YWxfYXV0b3JlcykgIA0KcGxvdGx5OjpnZ3Bsb3RseShncmFmX3RpcG9zX3JlbnRhKSAgDQpgYGANCiMgQ29zdG9zDQoNCmBgYHtyfQ0KdGNwXzM1MDAgPC0gcmVhZF9jc3YoIi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL3Jlc3VsdGFkb3MvYXV4aWxpYXJlcy90Y18zNTAwLmNzdiIpICU+JSANCiAgc2VsZWN0KC1YMSkNCg0KI2Nvc3RvcyBwcm9waW9zDQpjb3N0b3NfY2NubiA8LSByZWFkX3hsc3goIi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX2RlX2xhX3RpZXJyYV9oaWRyb2NhcmJ1cmlmZXJhX2FyZy54bHN4Iiwgc2hlZXQgPSAiY29zdG9zX2Njbm4iKSAlPiUNCiAgc2VsZWN0KGFuaW8sIGZ1ZW50ZSwgY29zdG9fYm9lID0gcHJlY2lvX2Nvc3RvLCBjb3N0b19tbWJ0dSA9IHByZWNpb19jb3N0b19tbWJ0dSkgJT4lIA0KICBmaWx0ZXIoYW5pbyAlaW4lICgxOTkwOjIwMjApICYgZnVlbnRlID09IkVtcGFsbWUgQ0NOTiIpICU+JSANCiAgbXV0YXRlKGF1dG9yID0gIlByb3BpYSAoRW1wYWxtZSBDQ05OKSIpDQoNCg0KWVBGX2Nvc3RvcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9ZUEYgY29zdG9zLnhsc3giKSAlPiUNCiAgc2VsZWN0KGFuaW8gPSAiQcOxbyIsIGxpZnRpbmdfY29zdCA9ICJDb3N0byBcImxpZnRpbmdcIiBhbCBjYW1iaW8gQk5BIiAsDQogICAgICAgICBleHBfY29zdCA9ICJDb3N0b3MgZGUgRXhwbG9yYWNpw7NuL2JvZSIgLGRlc19jb3N0PSAiQ29zdG9zIGRlIERlc2Fycm9sbG8vYm9lIiwNCiAgICAgICAgIHRyYW5zX2Nvc3QgPSAiQ29zdG9zIGRlIFRyYW5zcG9ydGUgeSBvdHJvcy9ib2UiICApICU+JSANCiAgbXV0YXRlKGFsbF9jb3N0PSBsaWZ0aW5nX2Nvc3QgK2V4cF9jb3N0ICt0cmFuc19jb3N0ICsgZGVzX2Nvc3QsIA0KICAgICAgICAgdW5pZGFkPSAiVVNEL0JPRSIsIGF1dG9yID0gIlByb3BpYSAoWVBGKSIsDQogICAgICAgICBhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQogIA0KIyAgICAgc2VsZWN0KDEsMiwzKQ0KIyAgICByZW5hbWUoYW5pbyA9ICJBw7FvIiwgdGMgPSAiVGFzYSBkZSBDYW1iaW8gQk5BIiwNCiMgICAgICAgICAgY29zdG9fcHJvZHVjY2lvbl9hdmcgID0gICAiQ29zdG9zIGRlIFByb2R1Y2Npw7NuIFByb21lZGlvIiwgY29zdG9fbGlmdGluZyA9ICdDb3N0byBcImxpZnRpbmdcIicsIA0KIyAgICAgICAgICBpbXB1ZXN0b3MgPSAiQ29zdG8gcG9yIEltcHVlc3RvcyBsb2NhbGVzIHkgc2ltaWxhcmVzIiwgb3Ryb3NfY29zdG9zID0gICAiT3Ryb3MgQ29zdG9zIikgJT4lIA0KIyBzdHIoWVBGX2Nvc3RvcykNCm5hbWVzKFlQRl9jb3N0b3MpDQpgYGANCg0KDQpgYGB7cn0NCmNvc3Rvc195cGYgPC0gIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9ZUEYgY29zdG9zLnhsc3ggLSBIb2phMS5jc3YiLA0KICAgIGNvbF90eXBlcyA9IGNvbHMoYEHDsW9gID0gY29sX2RvdWJsZSgpKSwgIGxvY2FsZSA9IGxvY2FsZShkZWNpbWFsX21hcmsgPSAiLCIpKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLCANCiAgICAgICAgIGNvc3RvX3Byb2R1Y2Npb25fYXZnICA9ICAgIkNvc3RvcyBkZSBQcm9kdWNjacOzbiBQcm9tZWRpbyIsIGNvc3RvX2xpZnRpbmcgPSAnQ29zdG8gXCJsaWZ0aW5nXCInLCANCiAgICAgICAgIGltcHVlc3RvcyA9ICJDb3N0byBwb3IgSW1wdWVzdG9zIGxvY2FsZXMgeSBzaW1pbGFyZXMiLCBvdHJvc19jb3N0b3MgPSAgICJPdHJvcyBDb3N0b3MiKSAlPiUgDQogIHNlbGVjdChhbmlvLCBjb3N0b19wcm9kdWNjaW9uX2F2ZywgY29zdG9fbGlmdGluZywgaW1wdWVzdG9zLCBvdHJvc19jb3N0b3MpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICAjIG11dGF0ZShjb3N0byA9IHN0cl9yZXBsYWNlKGNvc3RvLCAiLCIsICIuIikpICU+JSANCiAgIyBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHN0cl9yZXBsYWNlKHgsICIsIiwgIi4iKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBsZWZ0X2pvaW4odGNwXzM1MDAgJT4lIHNlbGVjdChhbmlvLCB0Y2MgPXRjY19hdmcpKSAlPiUNCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCAyOjUgICkgJT4lIA0KICBtdXRhdGUoIHZhbG9yID0gdmFsb3IvdGNjLCB1bmlkYWQ9ICJVU0QvQk9FIiwgYXV0b3IgPSAiUHJvcGlhIChZUEYpIikNCg0KIyBtaWNlOjptZC5wYXR0ZXJuKGNvc3Rvc195cGYsIHJvdGF0ZS5uYW1lcyA9IFQpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI2JvbGl2aWEgRU1JDQpjb3N0b19ib2xpdmlhIDwtIHJlYWRfZXhjZWwoICIvQXJjaGl2b3MvcmVwb3MvaGlkcm9jYXJidXJvcy9hbmFsaXNpcy9kYXRhL2JvbGl2aWEvVEcgWVBGQi54bHN4IiwgDQogICAgc2hlZXQgPSAiQ29zdG9zIElJIHNpbiBwb25kZXJhY2nDs24iLCBza2lwID0gNCkgJT4lDQogIHJlbmFtZShhbmlvID0gIi4uLjEiLCBjb3N0b19ib2UgPSAidSRzL0JQRSIsIGNvc3RvX21tYnR1ID0gInUkZC9NTUJUVSIpICU+JSANCiAgc2VsZWN0KGFuaW8sIGNvc3RvX2JvZSwgY29zdG9fbW1idHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGNvc3RvX2JvZSkpICU+JSANCiAgbXV0YXRlKGF1dG9yID0gIk11c3NpIChCb2xpdmlhKSIsDQogICAgICAgICBhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQojIENvc3RvcyBlbiBCT0UgbyBiYmwNCmNvc3RvcyA8LSByZW50YV90b3RhbF9zY2hlaW1iZXJnICU+JSANCiAgc2VsZWN0KGFuaW8sIGNvc3RvID0gY29zdG9fYm9lX3VzZCkgJT4lIA0KICBtdXRhdGUoYXV0b3IgPSAiU2NoZWltYmVyZyIpICU+JQ0KICByYmluZChyZW50YV90b3RhbF9tYW5zaWxsYSAlPiUgDQogICAgICAgICAgc2VsZWN0KGFuaW8sIGNvc3RvID0gY29zdG9fbG9jYWxfdXNkX2JibCkgJT4lIA0KICAgICAgICAgIG11dGF0ZSggYXV0b3IgPSAiTWFuc2lsbGEiKSkgJT4lDQogIHJiaW5kKHJlbnRhX3RvdGFsX2NhbXBvZG9uaWNvICU+JSANCiAgICAgICAgICBzZWxlY3QoYW5pbywgY29zdG8gPSBjb3N0b19sb2NhbF91c2RfYmJsKSAlPiUgDQogICAgICAgICAgbXV0YXRlKCBhdXRvciA9ICJDYW1wb2RvbmljbyIpKSAgJT4lIA0KICByYmluZChyZW50YV90b3RhbF9iYXJyZXJhICU+JSANCiAgICAgICAgICBzZWxlY3QoYW5pbywgY29zdG8gPSBjb3N0b19sb2NhbF91c2RfYmJsKSAlPiUgDQogICAgICAgICAgbXV0YXRlKCBhdXRvciA9ICJCYXJyZXJhIikpICU+JSANCiAgcmJpbmQoY29zdG9zX2Njbm4gJT4lIHNlbGVjdChjb3N0bz0gY29zdG9fYm9lLCBldmVyeXRoaW5nKC4pLCAtYyhmdWVudGUsIGNvc3RvX21tYnR1KSkpICU+JQ0KICAjIHJiaW5kKGNvc3Rvc195cGYgJT4lIGZpbHRlcih2YXJpYWJsZSA9PSAiY29zdG9fcHJvZHVjY2lvbl9hdmciKSAlPiUgc2VsZWN0KGFuaW8sIGNvc3RvPSB2YWxvciwgYXV0b3IpKSAlPiUgDQogIHJiaW5kKFlQRl9jb3N0b3MgJT4lICBzZWxlY3QoYW5pbywgY29zdG89IGFsbF9jb3N0LCBhdXRvcikpICU+JSANCiAgIyByYmluZChjb3N0b19ib2xpdmlhICU+JSBzZWxlY3QoLWNvc3RvX21tYnR1KSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL0JPRSIpDQoNCiNDb3N0b3MgZW4gQk9FDQpnZ3Bsb3QoY29zdG9zLCBhZXMoYW5pbywgY29zdG8sIGNvbG9yID0gYXV0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZT0gIkNvc3RvcyBkZSBwcm9kdWNjacOzbiBoaWRyb2NhcmJ1csOtZmVybyBlbiBBcmdlbnRpbmEiLCBzdWJ0aXRsZSA9ICJDb21wYXJhY2lvbiBwcm9waWEgKENDTk4gZSBZUEYpIHZlcnN1cyBvdHJvcyBhdXRvcmVzIChiYWxhbmNlcykiLA0KICAgICAgIGNhcHRpb24gPSAiTm90YTogU8OzbG8gU2NoZWltYmVyZyB5IGVzdGltYWNpw7NuIHByb3BpYSBwcmVzZW50YW4gY29zdG9zIGVuIEJPRSIsDQogICAgICAgeSA9ICJVU0QvYmFycmlsIiwgeCA9IkHDsW8iKSsNCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZT0gIkF1dG9yIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSMrDQogICMgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxNiwyKSkNCg0KI0Nvc3RvcyBlbiBNTUJUVQ0KY29zdG9zX2Njbm4gJT4lIA0KICBzZWxlY3QoLWMoZnVlbnRlLCBjb3N0b19ib2UpKSAlPiUgDQogIG11dGF0ZShhdXRvciA9ICJBcmdlbnRpbmEgKFByb3BpYSkiKSAlPiUgDQogIHJiaW5kKGNvc3RvX2JvbGl2aWEgJT4lIHNlbGVjdCgtY29zdG9fYm9lKSkgJT4lIA0KICBnZ3Bsb3QoIGFlcyhhbmlvLCBjb3N0b19tbWJ0dSwgY29sb3IgPSBhdXRvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlPSAiQ29zdG9zIGRlIHByb2R1Y2Npw7NuIGhpZHJvY2FyYnVyw61mZXJvIGVuIEFyZ2VudGluYSB5IEJvbGl2aWEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDb21wYXJhY2lvbiBwcm9waWEgKENDTk4pIHZlcnN1cyBFTSAoWVBGQikiLA0KICAgICAgIHkgPSAiVVNEL01NQlRVIiwgeCA9IkHDsW8iKSsNCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZT0gIlBhw61zIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSMrDQoNCndyaXRleGw6OndyaXRlX3hsc3goY29zdG9zLCBwYXRoID0gIi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL3Jlc3VsdGFkb3MvYXJnZW50aW5hL2Nvc3Rvcy54bHN4IikNCg0KYGBgDQoNCg0K